<?php
namespace Admin\Controller;

use Think\Controller;

class UsersController extends Controller
{
    function __destruct(){                                                                         // ��������规��  �����ョ�ㄦ�疯�块��������浣���ュ��
       // require '/home/wwwroot/default/world/behavior.php';
    }

  
    public function studentManage()
    {
       $Hint = new \Operation\Controller\HintController();     // 生成操作类对象
        $Hint->checkLogin(3);                                   // 判断是否登录
        $users = M('users');
        if (I('post.name')!="") {
        $where['username']=array('like','%'.I('post.name').'%');
        $where['stunum']=array('like','%'.I('post.name').'%');
        $where['realname']=array('like','%'.I('post.name').'%');
        $where['phone']=array('like','%'.I('post.name').'%');
        $where['_logic']='or';
        $map['_complex']=$where;
        $count=$users->where($map)->count();
        $page=getpage($count,8);
        $info=$users->where($map)->limit($page->FirstRow,$page->ListRow)->order("regdate desc")->select();
              }  
              else{
        $count = $users->where('role=1')->count();
        $page=getpage($count,8);                                
        $info = $users->where('role=1')->order("regdate desc")->limit($page->firstRow, $page->listRows)->select();              // 按照数据库中标志位0即为学生潮汛数据
        $number = 1;
              }

       
        $this->assign('info', $info);      // 将查询到的数据传输到前台
        $this->assign('page', $page->show());  //分页数据传输到前台               
        $this->assign('number', $number);
        $this->display();                                 // 将页面显示出来
    }
    // 添加学生页面
    public function studentAdd()
    {
        $Hint = new \Operation\Controller\HintController();     // 生成操作类对象
        $Hint->checkLogin(3);                                   // 判断是否登录
        if (! empty($_POST)) {
            $data = $this->dataSet($_POST, $_FILES['photo'],1); // 调用当前类的dataSet方法,目的:哪到POST数据写入data数组中,和调用上传文件方法，并返回文件名。  
            $users = M('users');                                // 生成数据对象
            $data['pwd'] = MD5(11);                                  // 设置默认密码
            $results = $users->add($data);                      // 将data数组中的数据写入到users表中
            if ($results) {
                $Hint->mysuccee("添加学生信息成功！", "2");
                die();
            }                                                   // 调用跳转等待页面“成功”，传入提示信息，等待时间为2秒
            else {
                $Hint->myerror("未知原因，学生信息添加失败；可能已有此学生信息，或服务器紧张原因导致。", "3");
                die();
            }                                                   // 调用跳转等待页面“失败”,传入提示信息，等待时间为3秒
        } else {
            $this->display();
        }
    }
    //删除学生
    public function studentDel()
    {
        $Hint = new \Operation\Controller\HintController();    // 生成操作类对象
        $Hint->checkLogin(3);                                  // 判断是否登录
        $users = M('users');                                   // 生成数据库对象
        $uid = $_REQUEST['id'];                                // 获取学生的id用作删除
        $filename = $users->where ( "uid=$uid" )->getField ( 'photo' );// 从数据库中取出头像名
        $results = $users->where("uid=$uid")->delete();        // 按照唯一的id值去删除该学生
        if ($results) {
            $file = './Public/UPLOADS/photo/' . "$filename";   // 把目录名存到file中
            unlink ( $file );                                  // 删除真实数据
            echo "0";
        } else {
            echo "1";
        }
    }
    
    
    //修改学生
    public function studentModify(){
        $Hint = new \Operation\Controller\HintController();     // 生成操作类对象
        $Hint->checkLogin(3);                                   // 判断是否登录
        $users = M('users');                                    // 生成数据库对象
        $uid = $_REQUEST['id'];                                 // 获取学生的id用作删除
        $info = $users->where("uid = $uid")->select();          // 按照表中的唯一值查找该学生的信息
        if(!empty($_POST)){
            $data = $this->dataSet($_POST, $_FILES['photo'],10);// 调用当前类的dataSet方法,目的:哪到POST数据写入data数组中,和调用上传文件方法，并返回文件名。
            if($data['photo']==null){ $data['photo'] = $info[0]['photo']; }//如果没上传新的头像，则用原来的。
            $filename = $users->where ( "uid=$uid" )->getField ( 'photo' );// 从数据库中取出头像名
            $rst = $users->where("uid=$uid")->save($data);      // 按照主键更新数据
            if($rst){
                $file = './Public/UPLOADS/photo/' . "$filename";// 把目录名存到file中
                if (strlen ( $file ) > 35) {                    // 默认头像路径strlen小于等于35，不能删除默认头像
                    unlink ( $file );                           // 删除真实数据
                }
                $Hint->mysuccee("修改成功","2","Admin/Users/studentManage");                      // 跳转到操作成功页面，提示“修改成功”
            }else {
                $Hint->myerror("修改失败");                       // 跳转到操作失败页面，提示“修改失败”
            }
        }else {
            $this->assign('info',$info);                        // 将查到的值传到前台
            $this->display();                                   // 显示页面
        }
    }
    
    //导入学生名单Excel
    
    public function studentImportExcel(){   
        if (!empty ( $_FILES)){
            $upload = new \Think\Upload();                      // 实例化上传类
            $upload->maxSize   =     10485760 ;                 // 设置附件上传大小
            $upload->exts      =     array('xls','xlsx');       // 设置附件上传类型
            $upload->rootPath  = './Public/Excel/';             // 设置附件上传根目录
            $upload->autoSub   = false;                         // 将自动生成以photo后面加时间的形式文件夹，关闭
            
            // 上传文件
            $info   =   $upload->upload();                                   // 上传文件
            $exts   = $info['excel']['ext'];                                 // 获取文件后缀
            $filename = $upload->rootPath.$info['excel']['savename'];        // 生成文件路径名
            if(!$info) {                                                     // 上传错误提示错误信息
                $this->error($upload->getError()); 
            }else{                                                           // 上传成功
                import("Org.Util.PHPExcel");                                 // 导入PHPExcel类库，因为PHPExcel没有用命名空间，只能inport导入
                $PHPExcel = new \PHPExcel();                                 // 创建PHPExcel对象，注意，不能少了\
                if ($exts == 'xls') {                                        // 如果excel文件后缀名为.xls，导入这个类
                    import("Org.Util.PHPExcel.Reader.Excel5");
                    $PHPReader = new \PHPExcel_Reader_Excel5();
                } else 
                    if ($exts == 'xlsx') {
                        import("Org.Util.PHPExcel.Reader.Excel2007");
                        $PHPReader = new \PHPExcel_Reader_Excel2007();
                    }

                $PHPExcel = $PHPReader->load($filename);                     // 载入文件
                $currentSheet = $PHPExcel->getSheet(0);                      // 获取表中的第一个工作表，如果要获取第二个，把0改为1，依次类推
                $allColumn = $currentSheet->getHighestColumn();              // 获取总列数
                $allRow = $currentSheet->getHighestRow();                    // 获取总行数
                for ($currentRow = 0; $currentRow <= $allRow; $currentRow ++) {// 循环获取表中的数据，$currentRow表示当前行，从哪行开始读取数据，索引值从0开始
                    for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn ++) {// 从哪列开始，A表示第一列
                        $address = $currentColumn . $currentRow;             // 数据坐标
                        $ExlData[$currentRow][$currentColumn] = $currentSheet->getCell($address)->getValue();// 读取到的数据，保存到数组$arr中
                    }
                }
                $Hint = new \Operation\Controller\HintController();          // 生成操作类对象
                $data = studentImportExcel_RAW($ExlData);                    // 调用公用方法的读数组并写入数据库操作
                $users = M('users');                                         // 生成数据库对象
                $result = $users->addAll($data);                             // 批量写入数据库
                if ($result) {                                               // 验证
                    $Hint->mysuccee("导入成功", "2", "Admin/Users/studentManage");// 跳转学生管理页面
                } else {
                    $Hint->myerror("导入失败，原因可能是excel表中有些用户已被注册。或表格格式错误","5");// 提示错误
                }
            }
        }else {
          $this->display(); 
        }    
                
}
    
    //教师列表
    public function teacherManage()
    {
        $Hint = new \Operation\Controller\HintController();     // 生成操作类对象
        $Hint->checkLogin(3);                                   // 判断是否登录
        $user = M('users');                                     // 生成数据库对象
        $ild = $user->where('role=2')->select();                // 按照数据库中role为1即教师查询信息
        $this->assign('in', $ild);                              // 将值传入到前台
        $this->display();                                       // 显示页面
    }
    
    //添加教师
    public function teacherAdd()
    {
        $Hint = new \Operation\Controller\HintController();     // 生成操作类对象
        $Hint->checkLogin(3);                                   // 判断是否登录
        if (! empty($_POST)) {
            $data = $this->dataSet($_POST, $_FILES['photo'],2); // 调用当前类的dataSet方法,目的:哪到POST数据写入data数组中,和调用上传文件方法，并返回文件名。         
            $users = M('users');                                // 生成数据库对象
            $data['pwd'] = 11;                                  // 设置默认密码
            $las = $users->add($data);                          // 将数据添加到数据数据库
            if ($las) {
                $Hint->mysuccee("添加教师信息成功！", "2");         // 跳转到“跳转等待页面”，传入提示信息，等待时间为2秒
            }                                              
            else {
                $Hint->myerror("添加教师信息失败！", "1");          // 跳转到“跳转等待页面”，传入提示信息，等待时间为3秒
            }
        } else {
            $this->display();
        }
    }
   
    //删除教师
    public function teacherdele()
    {
        $Hint = new \Operation\Controller\HintController();     // 生成操作类对象
        $Hint->checkLogin(3);                                   // 判断是否登录
        $id = $_REQUEST['id'];                                  // 获取教师id，即唯一值，用作删除
        $Management = M('users');                               // 生成数据库对象
        $filename = $Management->where ( "uid=$id" )->getField ( 'photo' );// 从数据库中取出头像名
        $il = $Management->where("uid=$id")->delete();          // 按照id删除教师
        if ($il) {
            $file = './Public/UPLOADS/photo/' . "$filename";   // 把目录名存到file中
            unlink ( $file );                                  // 删除真实数据
            echo "0";
        } else {
            echo "1";
        }
    }
    
    //修改教师
    public function teacherModify()
    {
        $Hint = new \Operation\Controller\HintController();     // 生成跳转等待对象
        $Hint->checkLogin(3);                                   // 判断是否登录
        $users = M('users');                                    // 生成数据库对象
        $uid = $_REQUEST['id'];                                 // 获取教师的id用作删除
        $info = $users->where("uid = $uid")->select();          // 按照表中的唯一值查找该学生的信息
        if (!empty($_POST)) {
            $data = $this->dataSet($_POST, $_FILES['photo'],20);// 调用当前类的dataSet方法,目的:哪到POST数据写入data数组中,和调用上传文件方法，并返回文件名。
            if($data['photo']==null){ $data['photo'] = $info[0]['photo']; }//如果没上传新的头像，则用原来的。
            $filename = $users->where ( "uid=$uid" )->getField ( 'photo' );// 从数据库中取出头像名
            $rst = $users->where("uid=$uid")->save($data);      // 更新数据
            if($rst){
                $file = './Public/UPLOADS/photo/' . "$filename";// 把目录名存到file中
                if (strlen ( $file ) > 35) {                    // 默认头像路径strlen小于等于35，不能删除默认头像
                    unlink ( $file );                           // 删除真实数据
                }
                $Hint->mysuccee("修改教师信息成功");                // 提示信息
            }else {
                $Hint->myerror("修改教师信息失败");                 // 提示信息
            }
        } else {
            $this->assign('info',$info);                        // 传入前台值
            $this->display();
        }
    }
    
    // 此方法为将教师用户升级为管理员
    public function modifyPermissions()
    {
        $Hint = new \Operation\Controller\HintController();     // 生成对象，用作调用跳转等待页面
        $Hint->checkLogin(3);                                   // 判断是否登录
        $uid = $_REQUEST['id'];                                 // 获取前台的id值用作唯一数据库操作
        $name = $_REQUEST['name'];                              // 获取前台传来的教师名字以做跳转页面显示
        $users = M('users');                                    // 生成数据库操作对象
        $data['role'] = 2;                                      // 写入数据库字段role为2，目的为更改标志位，已升级为管理员账户
        $rst = $users->where("uid=$uid")->save($data);          // 写入数据库
        if ($rst) {                                             // 判断数据库操作是否成功
            $Hint->mysuccee("成功将'$name'老师提升为管理员！", "3"); // 调用跳转等待页面传入教师姓名显示，页面等待时间为3秒
        } else {
            $Hint->myerror("错误，原因未知！", "2");               // 调用跳转等待页面，页面为失败页面，传入提示信息，等待时间为2秒
        }
    }
    
    // 此方法为多个方法共用，通过传入上传的文件进行上传操作，最后返回一个“文件名”写入数据库
    public function uploadOne($file)
    {
        $upload = new \Think\Upload();                    // 实例化上传类
        $upload->maxSize = 3145728;                       // 设置附件上传大小
        $upload->exts = array('jpg','gif','png','jpeg');  // 设置附件上传类型
        $upload->rootPath = './Public/UPLOADS/photo/';    // 设置附件上传根目录
        $upload->savePath = '';                           // 设置上传子目录
        $upload->autoSub = true;                          // 将自动生成以photo后面加时间的形式文件夹，关闭
        $upload->subName = array('date','Ymd');           // 设置子目录命名规则
        $upload->saveName = time() . '_' . mt_rand();     // 以时间形式命名文件名
        $info = $upload->uploadOne($file);                // 上传文件操作
        $info['savename'] = $info['savepath'].$info['savename'];
        return $info['savename'];                         // 返回文件名
    }
    
    // 此方法为设置要插入数据库的字段，这个方法中央控制的是智能的。
    public function dataSet($post, $file,$static)         // 接收三个值，分别为：POST数据、文件信息、标志位。
    {
        $Hint = new \Operation\Controller\HintController();// 生成操作类对象
        $Hint->checkLogin(3);                             // 判断是否登录
        if($static==2||$static==20){                      // 判断是否为教师或教师修改过来的
            $data["username"] = $_POST["username"];       // 写入用户名
            $data["realname"] = $_POST["teachername"];    // 写入真实姓名
            $data["email"] = $_POST["meil"];              // 写入邮箱地址
            $data["phone"] = $_POST["teachertele"];       // 写入学号
            $data['role'] = 2;                            // 标志为1，是为教师
        }
        if($static==1||$static==10){                      // 判断是否为学生或学生修改过来的
            $data['role'] = 1;                            // 写入数据库标志位为0，即为学生
            $data['username'] = $_POST['username'];       // 写入用户名
            $data['realname'] = $_POST['realname'];       // 写入真实姓名
            $data['stunum'] = $_POST['studentid'];        // 写入学号
            $data['email'] = $_POST['mail'];              // 写入邮箱地址
            $data['phone'] = $_POST['phone'];             // 写入电话号
        }
        $data['regdate'] = date('Y-m-d H:i:s', time());   // 写入注册时间
        $data['intro'] = "这家伙很懒，什么都没留下！";         
        if ($file != null) {                              // 如果有上传文件就进行上传文件
            $data['photo'] = $this->uploadOne($file);     // 获取文件名：通过上传单个文件方法，进行上传文件操作
        }                                                 // 这个地方是个很奇怪的地方，如果用else就不会走else这个分支
        if($static!=10&&$static!=20){                     // 判断如果不是修改学生页面或教师页面过来的就设置一个默认的头像
            if ($data['photo'] == null)                   // 由于上述原因，才用的判断该字段是否为空。作用为判断是否上传头像
                $data['photo'] = $Hint->randPhoto();      // 写入默认头像
        }

        return $data;                                     // 传回data数组，用作写入数据库
    }
}